<?php

require_once 'JSON.php';

/**
 * Ответ приложения в формате JSON. Используем реализацию третьих сторон. Когда
 * разработчики более-менее доведут php_json до ума, можно будет использовать его.
 *
 */
class Kernel_Response_Json extends Kernel_Response_Abstract {

    /**
     * Массив переменных ответа.
     *
     * @var array
     */
    private $_vars = array();

    /**
     * Конструктор.
     *
     */
    public function __construct() {
        $this->header('Content-type', 'application/json');
    }

    /**
     * Устанавливает набор переменных ответа.
     *
     * @param   array   $vars
     * @return  Kernel_Response_Json
     */
    public function assign($var, $value = null) {
        $this->_vars = array_merge($this->_vars, is_array($var) ? $var : array($var => $value));
        return $this;
    }

    /**
     * Выводит в ответ ошибку, описанную указанным исключением.
     *
     * @param   Kernel_Filter_Exception $e
     * @return  Kernel_Response_Json
     */
    public function error($e) {
        return parent::error($e)->assign('error', $e->getMessage());
    }

    /**
     * Отображает указанное сообщение.
     *
     * @param   Kernel_Response_Message $message
     */
    protected function _message(Kernel_Response_Message $message) {
        // передаем сообщение в ответ
        $message->display();
    }

    /**
     * Устанавливает путь к файлу шаблона ответа.
     * :KLUDGE: временно — для того, чтобы работала отправка форм через Ajax.
     *
     * @param   string  $template
     * @return  Kernel_Response_Json
     */
    public function setTemplate($template) {
        return $this;
    }

    /**
     * Возвращает содержимое ответа, сгенерированное по шаблону.
     *
     * @return  string
     */
    protected function _template() {
        $json = new Services_JSON;
        return $json->encode($this->_vars);
    }
}
